home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / ObiWanDCMDSourceDist.sit / ObiWan DCMD Source Dist / ObiWanDcmd.p < prev    next >
Text File  |  1996-06-22  |  4KB  |  171 lines

  1. unit GrabbugDcmd;
  2.  
  3. (* ©1996 Quinn "The Eskimo!" *)
  4. (* This file is distributed as Freeware. *)
  5.  
  6. interface
  7.  
  8.     uses
  9.         Types,
  10.         TextUtils,
  11.         Files,
  12.         GestaltEqu,
  13.         Errors,
  14.         (* for some reason all UPI uses must go before Dcmd.p  *sigh* *)
  15.         Dcmd,
  16.         
  17.         LineTypes;
  18.  
  19.     procedure CommandEntry (paramPtr: dcmdBlockPtr);
  20.  
  21. implementation
  22.  
  23.     const
  24.         obiWanNotFoundErr = -666;
  25.         fsBusyErr = -667;
  26.         olReentryErr = -668;
  27.         olNotFound = -669;
  28.         
  29.     const
  30.         ol_find_exhaustive = 1;
  31.         ol_next_exhaustive = 2;
  32.         ol_find = 3;
  33.         ol_next = 4;
  34.     
  35.     function DecStr(l : longint) : Str15;
  36.         var
  37.             tmp : packed array [0..9] of char;
  38.             res : Str15;
  39.             negative : Boolean;
  40.             b : longint;
  41.     begin
  42.         tmp := '0123456789';
  43.         negative := (l < 0);
  44.         l := abs(l);
  45.         repeat
  46.             b := l mod 10;
  47.             res := concat(chr(b + ord('0')), res);
  48.             l := l div 10;
  49.         until l = 0;
  50.         if negative then begin
  51.             res := concat('-', res);
  52.         end; (* if *)
  53.         DecStr := res;
  54.     end; (* DecStr *)
  55.     
  56.     function CallLookupProc(cmd : longint; key : Str255; var count : longint; var result : linesArray; proc : ProcPtr) : OSErr;
  57.     inline
  58.         $205F, (* move.l    (a7)+,a0        ; pop proc address    *)
  59.         $4E90; (* jsr            (a0)                ; call proc                    *)
  60.  
  61.     const
  62.         FSBusy = $360;
  63.  
  64.     function DoObiWanLookup(exhaustive : Boolean; key : Str255) : OSErr;
  65.         var
  66.             err : OSErr;
  67.             cmd : longint;
  68.             lookup_proc : ProcPtr;
  69.             done : Boolean;
  70.             line : longint;
  71.             count : longint;
  72.             result : linesArray;
  73.             junk_char : char;
  74.             printed_something : Boolean;
  75.     begin
  76.         err := noErr;
  77.         if Ptr(FSBusy)^ <> 0 then begin
  78.             err := fsBusyErr;
  79.         end; (* if *)
  80.         if err = noErr then begin
  81.             err := Gestalt('OB1K', longint(lookup_proc));
  82.             if (err <> noErr) or (lookup_proc = nil) then begin
  83.                 err := obiWanNotFoundErr;
  84.             end; (* if *)
  85.         end; (* if *)
  86.         
  87.         if err = noErr then begin
  88.             if exhaustive then begin
  89.                 dcmdDrawLine(concat('ObiWan exhaustive search for “', key, '”...'));
  90.             end else begin
  91.                 dcmdDrawLine(concat('ObiWan find “', key, '”...'));
  92.             end; (* if *)
  93.             cmd := ord(not exhaustive) * 2 + 1;
  94.             printed_something := false;
  95.             repeat
  96.                 err := CallLookupProc(cmd, key, count, result, lookup_proc);
  97.                 if err = noErr then begin
  98.                     printed_something := true;
  99.                     dcmdDrawLine('');
  100.                     for line := 1 to count do begin
  101.                         dcmdDrawLine(result[line]);
  102.                     end; (* for *)
  103.                     done := not dcmdDrawPrompt('Press Return to search for next.');
  104.                     cmd := ord(not exhaustive) * 2 + 2;
  105.                 end else if err = olNotFound then begin
  106.                     if not printed_something then begin
  107.                         dcmdDrawLine('... nothing found.');
  108.                     end; (* if *)
  109.                     done := true;
  110.                     err := noErr;
  111.                 end; (* if *)
  112.             until (err <> noErr) or done;
  113.         end; (* if *)
  114.  
  115.         DoObiWanLookup := err;
  116.     end; (* DoObiWanLookup *)
  117.  
  118.     procedure CommandEntry (paramPtr: dcmdBlockPtr);
  119.         var
  120.             err : OSErr;
  121.             text : Str255;
  122.             junk_char : char;
  123.             exhaustive : Boolean;
  124.     begin
  125.         err := noErr;
  126.         case paramPtr^.request of
  127.             dcmdSecondaryInit :
  128.                 ;
  129.             dcmdShutdown :
  130.                 ;
  131.             dcmdDoIt :
  132.                 begin
  133.                     exhaustive := false;
  134.                     junk_char := dcmdGetNextParameter(text);
  135.                     if copy(text, 1, 2) = '-s' then begin
  136.                         exhaustive := true;
  137.                         junk_char := dcmdGetNextParameter(text);
  138.                     end; (* if *)
  139.                     err := DoObiWanLookup(exhaustive, text);
  140.                 end;
  141.             dcmdHelp :
  142.                 begin
  143.                     dcmdDrawLine('ObiWan [-shift] text');
  144.                     dcmdDrawLine('  Display ObiWan entry for text.');
  145.                 end;
  146.             dcmdGetInfo :
  147.                 begin
  148.                     GetInfoRequestBlockPtr(paramPtr^.requestIOBlock)^.usageStr := '';
  149.                     GetInfoRequestBlockPtr(paramPtr^.requestIOBlock)^.creditsStr := '©1996 Quinn "The Eskimo!"';
  150.                     GetInfoRequestBlockPtr(paramPtr^.requestIOBlock)^.dcmdVersion.majorRev := $01;
  151.                     GetInfoRequestBlockPtr(paramPtr^.requestIOBlock)^.dcmdVersion.minorAndBugRev := $00;
  152.                     GetInfoRequestBlockPtr(paramPtr^.requestIOBlock)^.dcmdVersion.stage := betaStage;
  153.                     GetInfoRequestBlockPtr(paramPtr^.requestIOBlock)^.dcmdVersion.nonRelRev := $01;
  154.                 end;
  155.         otherwise
  156.             (* do nothing *)
  157.         end; (* case *)
  158.         if err <> noErr then begin
  159.             if err = obiWanNotFoundErr then begin
  160.                 dcmdDrawLine('ObiWan is not running.');
  161.             end else if err = fsBusyErr then begin
  162.                 dcmdDrawLine('ObiWan cannot run because the file system is busy.');
  163.             end else if err = olReentryErr then begin
  164.                 dcmdDrawLine('ObiWan cannot run because ObiWan is busy.');
  165.             end else begin
  166.                 dcmdDrawLine(concat('ObiWan error ', DecStr(err), '.'));
  167.             end; (* if *)
  168.         end; (* if *)
  169.     end; (* CommandEntry  *)
  170.  
  171. end. (* GrabbugDcmd *)